Оператор [subscribe]

картинка

Назначение

Оператор [subscribe] позволяет подписать логический узел правила на системное событие. Это даёт возможность реагировать на асинхронные события, возникающие в работе устройства (например, поднятие сетевого интерфейса, изменение конфигурации и т.п.).

Принцип работы

Когда происходит событие (например, интерфейс инициирует на системной шине событие IFUP), узел с оператором [subscribe] получает данные этого события.

Важная особенность: Данные, полученные по подписке, хранятся в течение двух итераций обработки правила. Это необходимо для того, чтобы все узлы правила (включая те, что расположены до узла-подписчика) успели обработать поступившую информацию.

Структура оператора

Оператор [subscribe] принимает таблицу с параметрами:

Параметр Описание
ubus Название объекта, от которого ожидается событие
evname Имя события, на которое осуществляется подписка
match Фильтр по атрибутам события (опционально)

Пример правила с подпиской

В данном примере 3 узла:

  • N1_before — отправляет данные в веб-интерфейс (оператор ui-update)
  • N2_gsm_up — ожидает данные по подписке (оператор subscribe)
  • N3_after — журналирует событие (оператор journal)

1-й и 3-й узлы используют данные 2-го узла, поступившие в него по подписке.

Код правила

--[[ Узел "N1_before" ]]
------------------------

N1_before = {
    {
        ["ui-update"] = function(nodes)
            return {
                event_name = "Состояние сетевого интерфейса `modem` - UP",
                event_data = nodes.N2_gsm_up
            }
        end
    }
}

--[[ Узел "N2_gsm_up" ]]
------------------------

N2_gsm_up = {
    ["subscribe"] = function(nodes)             -- Оператор ["subscribe"] принимает в качестве настроек следующие параметры:
        return {                               
            ubus = "network.interface",         -- - название объекта, от которого ожидать событие;
            evname = "interface.update",        -- - имя события, на которое подписаться;
            match = { interface = "modem"}      -- - означает фильтровать поступающие события по атрибуту "interface=modem";
        }
    end
}

--[[ Узел "N3_after" ]]
-----------------------

N3_after = {
    {
        ["ui-update"] = function(nodes)
            return {
                event = "Изменилось состояние сетевого интерфейса `modem`",
                event_data = nodes.N2_gsm_up
            }
        end
    }
}